task
有n种底为1*1的长方体,高分别是1到n,而每种长方体只有两个。这种我们要求办这些长方体排成一排,满足前半部分单调不减,后半部分单调不增,两个部分也可以只有一个部分。如以下这些方案:
[1, 2, 2, 3, 4, 4, 3, 1];
[1, 1];
[2, 2, 1, 1];
[1, 2, 3, 3, 2, 1].
现在我们还有(1<=m<=100)个限制,如x>y,表示第x个长方体的高度大于第y个长方体的高度。这样的限制有5种,分别是”x
求方案数。
$1<=n<=35$
$1<=m<=100$
solution
一看题目就知道是dp题。
$dp[L][R]$表示区间[L,R]内的方案数。
如果我们从小到大放每种的两个数我们可以知道我们只有三种放法:
- 两个数都放区间的左边。
- 两个数都放区间的右边。
- 一个数放区间的左边,一个数放区间的右边。
而且根据经验,这种状态的dp一般都是用记忆化搜索来写,所以我们状态的转移就是
而边界就是$R-L==1$.
但是这题并不是简单的记忆化搜索,而是还有限制条件的。
对于每个限制条件我们可以把这些数的关系存下来,然后每次转移前都判断一下。
对于所有情况,我们都需要判断一下放的这两个数的位置是否可以相等的关系。
- 两个数都放区间的左边,然后判断左边已经放的数中(即[1,L+2])是否有与在R位置上的数不满足小于关系的。接着是判断剩余没有放的数中(即[L+3,R])是否有与L和L+1位置上的数不满足大于关系的。
- 两个数都放区间的右边,然后判断左边已经放的数中(即[R-2,n])是否有与在L位置上的数不满足小于关系的。接着是判断剩余没有放的数中(即[L,R-3])是否有与R和R-1位置上的数不满足大于关系的。
- 一个数放区间的左边,一个数放区间的右边。那么我们就只用判断只剩余还没有放的数中是否有与L和R上的数不满足大于关系的。
Code
1 |
|